package com.juzi.模拟购物车;

import java.util.Scanner;

/**
    目标：面向对象编程，购物车模块模拟
 */
public class ShopCarTest {
    public static void main(String[] args) {
        //1、定义一个商品类，用于后期创建商品对象（新建Goods类）
        //2、定义一个购物车对象，使用一个数组表示。
        Goods[] shopCar = new Goods[100];// [null, null, null, null, ...]
        //3、搭建操作架构
        while (true) {//将15-43 行代码 放到死循环中  使得用户输入add指令后 还可以继续进入分支输入指令
            System.out.println("请您选择指令进行操作:");
            System.out.println("添加商品到购物车：add");
            System.out.println("查询商品到购物车：query");
            System.out.println("修改商品购买数量：update");
            System.out.println("结算商品购买金额：pay");
            //进行输入，要定义扫描器 要扫描器对象才能接受输入
            Scanner sc = new Scanner(System.in);
            System.out.println("请您输入指令：");
            String command = sc.next();
            switch (command){
                case "add":
                    //添加商品到购物车
                    addGoods(shopCar , sc);
                    break;
                case "query":
                    //查询商品到购物车
                    queryGoods(shopCar);
                    break;
                case "update":
                    //修改商品购买数量
                    updateGoods(shopCar , sc);
                    break;
                case "pay":
                    //结算商品购买金额
                    payGoods(shopCar);
                    break;
                default:
                    System.out.println("没有该指令");
            }
        }
    }

    public static void payGoods(Goods[] shopCar) {
        queryGoods(shopCar);
        //1、定义一个求和变量 累加金额
        double money = 0;
        //2、遍历购物车数组中全部商品对象， 累加 单价*数量
        for (int i = 0; i < shopCar.length; i++) {
            Goods g = shopCar[i];
            if (g != null) {
                money += (g.price * g.buyNumber);
            }else {
                break;
            }
        }
        System.out.println("订单总金额:" + money);
    }


    /**
     修改商品购买数量
     */
    public static void updateGoods(Goods[] shopCar, Scanner sc) {
        //让用户输入要修改商品的id 根据id 查询出 要修改的商品对象 像这样的东西我们最好独立成一个方法 因为根据id查的商品对象的话，以后可能还会再用
            while (true) {//63行 注释，所以把58-66行代码 放入到死循环中去
            System.out.println("请您输入要修改的商品id:");
            int id = sc.nextInt();
            Goods g = getGoodsById(shopCar,id);
            if (g == null){
                //没有该商品
                System.out.println("对不起，您未购买该商品！");//没有购买，重新输入，再查找
            }else {
                //存在该商品对象，可以修改
                System.out.println("请您输入:" + g.name + "商品购买数量:");
                int buyNumber = sc.nextInt();
                g.buyNumber = buyNumber;
                System.out.println("修改完成！");
                queryGoods(shopCar);
                break;
            }
        }
    }

    public static Goods getGoodsById(Goods[] shopCar , int id){
        for (int i = 0; i < shopCar.length; i++) {
            Goods g = shopCar[i];
            if (g != null){
                //判断这个商品id是否为我们要找的
                if (g.id == id) {
                    return g;
                }
            }else {
                return null;//找完了存在已知商品中没有
            }
        }
        return null;//找完了所有商品中都没有
    }


    /**
     查询商品到购物车，并展示出来
     */
    public static void queryGoods(Goods[] shopCar) {
        System.out.println("***************查询购物车信息如下***************");
        System.out.println("编号\t\t\t名称\t\t\t价格\t\t\t购买数量");
        //遍历购物车信息
        for (int i = 0; i < shopCar.length; i++) {
            Goods g = shopCar[i];
            if (g != null){
                //展示这个商品对象
                System.out.println(g.id + "\t\t\t" + g.name + "\t\t\t" + g.price + "\t\t\t" + g.buyNumber);
            }else {
                //遍历结束
                break;
            }
        }
    }

    /**
        完成商品添加到购物车的功能
     */
    public static void addGoods(Goods[] shopCar ,Scanner sc) {
        //1、录入用户输入的购买商品的信息
        //首先要有扫描器,也可也把20行代码的扫描器传过来，内部就可以不用写
//        Scanner sc1 = new Scanner(System.in);
        System.out.println("请您输入购买商品的编号（不重复）:");
        int id = sc.nextInt();
        System.out.println("请您输入购买商品的名称:");
        String name = sc.next();
        System.out.println("请您输入购买商品的数量:");
        int buyNumber = sc.nextInt();
        System.out.println("请您输入购买商品的价格:");
        double price = sc.nextDouble();

         //2、把这些购买商品的信息封装成一个商品对象
        //前边为对象里边的全变量 也就是属性   后边的是用户输入的信息
        Goods g = new Goods();
        g.id = id;
        g.name = name;
        g.buyNumber = buyNumber;
        g.price = price;

        //3、把这个商品对象添加到购物车数组中去
        //遍历购物车数组，看哪个位置是null  就把新商品放到该位置
        for (int i = 0; i < shopCar.length; i++) {
            if (shopCar[i] == null){
                //说明此处位置没有元素存入，把我们新买的商品添加到此处即可
                shopCar[i] = g;//存的是商品的地址
                break;//商品已经成功存入，不需要继续找位置
            }
        }
        System.out.println("您的商品" + g.name + "已成功添加到购物车！");
    }
}
